package ghostcat.algorithm.traversal {
	import flash.display.*;
	import flash.geom.*;

	public class MapModel extends Object implements IMapModel {
		private var noteMap:Array;
		private var _map:Array;
		private const COST_DIAGONAL:int = 14;
		private const COST_STRAIGHT:int = 10;
		public var diagonal:Boolean = true;

		public function MapModel(param1:Array = null) {
			if (param1) {
				this.map = param1;
			}
			return;
		} // end function

		protected function isBlock(param1:Point, param2:Point):Boolean {
			var rows:int = _map.length;
			var cols:int = _map[0].length;
			if (param1.x < 0 || param1.x >= cols || param1.y < 0 || param1.y >= rows) {
				return true;
			}
			return _map[param1.y][param1.x];
		} // end function

		public function setNode(param1:Point, param2:TraversalNote):void {
			if (this.noteMap[param1.y] == null) {
				this.noteMap[param1.y] = [];
			}
			this.noteMap[param1.y][param1.x] = param2;
			return;
		} // end function

		public function reset():void {
			this.noteMap = [];
		} // end function

		public function set map(param1:Array):void {
			_map = param1;
		} // end function

		public function toBitmap():Bitmap {
			var _col:int = 0;
			var _bitMap:Bitmap = new Bitmap(new BitmapData(_map[0].length, _map.length));
			var _row:int = 0;
			while (_row < _map.length) {
				_col = 0;
				while (_col < _map[_row].length) {

					if (_map[_row][_col]) {
						_bitMap.bitmapData.setPixel(_col, _row, 0);
					}
					_col++;
				}
				_row++;
			}
			return _bitMap;
		} // end function

		public function getArounds(param1:Point):Array {
			if (param1 == null) {
				return [];
			}
			var _loc_4:Point = null;
			var _loc_5:Boolean = false;
			var _loc_2:Array = [];
			var _loc_3:Point = new Point(param1.x, param1.y);
			_loc_4 = new Point((param1.x + 1), param1.y);
			var _loc_6:* = !isBlock(_loc_4, _loc_3);
			if (!isBlock(_loc_4, _loc_3)) {
				_loc_2.push(_loc_4);
			}
			_loc_4 = new Point(param1.x, (param1.y + 1));
			var _loc_7:* = !isBlock(_loc_4, _loc_3);
			if (!isBlock(_loc_4, _loc_3)) {
				_loc_2.push(_loc_4);
			}
			_loc_4 = new Point((param1.x - 1), param1.y);
			var _loc_8:* = !isBlock(_loc_4, _loc_3);
			if (!isBlock(_loc_4, _loc_3)) {
				_loc_2.push(_loc_4);
			}
			_loc_4 = new Point(param1.x, (param1.y - 1));
			var _loc_9:* = !isBlock(_loc_4, _loc_3);
			if (!isBlock(_loc_4, _loc_3)) {
				_loc_2.push(_loc_4);
			}
			if (diagonal) {
				_loc_4 = new Point((param1.x + 1), (param1.y + 1));
				_loc_5 = !isBlock(_loc_4, _loc_3);
				if (_loc_5 && _loc_6 && _loc_7) {
					_loc_2.push(_loc_4);
				}
				_loc_4 = new Point((param1.x - 1), (param1.y + 1));
				_loc_5 = !isBlock(_loc_4, _loc_3);
				if (_loc_5 && _loc_8 && _loc_7) {
					_loc_2.push(_loc_4);
				}
				_loc_4 = new Point((param1.x - 1), (param1.y - 1));
				_loc_5 = !isBlock(_loc_4, _loc_3);
				if (_loc_5 && _loc_8 && _loc_9) {
					_loc_2.push(_loc_4);
				}
				_loc_4 = new Point((param1.x + 1), (param1.y - 1));
				_loc_5 = !isBlock(_loc_4, _loc_3);
				if (_loc_5 && _loc_6 && _loc_9) {
					_loc_2.push(_loc_4);
				}
			}
			return _loc_2;
		} // end function

		public function get map():Array {
			return _map;
		} // end function

		public function getScoreAddon(param1, param2, param3, param4):int {
			return (Math.abs(param4.x - param3.x) + Math.abs(param4.y - param3.y)) * COST_STRAIGHT;
		} // end function

		public function reachEnd(param1:Point, param2:Point):Boolean {
			if (param1 == null || param2 == null) {
				return false;
			}
			return (param1 as Point).equals(param2 as Point);
		} // end function

		public function getNode(param1:Point):TraversalNote {
			if (this.noteMap[param1.y] == null) {
				return null;
			}
			return this.noteMap[param1.y][param1.x];
		} // end function

		public function getCostAddon(param1, param2, param3, param4):int {
			return param3.x == param2.x || param3.y == param2.y ? (COST_STRAIGHT) : (COST_DIAGONAL);
		} // end function

	}
}
